home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / fpkpas92.zip / SRCRTL.ZIP / RTL / DOS / MATH.INC < prev    next >
Text File  |  1997-07-01  |  5KB  |  267 lines

  1. {****************************************************************************
  2.  
  3.                           Copyright (c) 1994 by 
  4.                             Florian Klämpfl
  5.  
  6.  ****************************************************************************}
  7.  
  8. { Implementation der math. Routinen (nur real) }
  9.  
  10.     function abs(d : real) : real;
  11.     
  12.       begin
  13.          asm
  14.             fldl 8(%ebp)
  15.             fabs
  16.             leave
  17.             ret $8
  18.          end [];
  19.       end;
  20.       
  21.     function sqr(d : real) : real;
  22.     
  23.       begin
  24.          asm
  25.             fldl 8(%ebp)
  26.             fldl 8(%ebp)
  27.             fmulp
  28.             leave
  29.             ret $8
  30.          end [];
  31.       end;
  32.       
  33.     function sqrt(d : real) : real;
  34.     
  35.       begin
  36.          asm
  37.             fldl 8(%ebp)
  38.             fsqrtl
  39.             leave
  40.             ret $8
  41.          end [];
  42.       end;
  43.       
  44.     function sqrt(d : fixed) : fixed;
  45.     
  46.       begin
  47.      asm
  48.         movl d,%eax
  49.         movl %eax,%ebx
  50.         movl %eax,%ecx
  51.         jecxz kl
  52.         xorl %esi,%esi
  53.      it:
  54.         xorl %edx,%edx
  55.         idivl %ebx
  56.         addl %ebx,%eax
  57.         shrl $1,%eax
  58.         subl %eax,%esi
  59.         cmpl $1,%esi
  60.         jbe kl
  61.         movl %eax,%esi
  62.         movl %eax,%ebx
  63.         movl %ecx,%eax
  64.         jmp it
  65.      kl:
  66.         shl $8,%eax
  67.         leave
  68.         ret $4
  69.       end;
  70.       end;
  71.  
  72.     function arctan(d : real) : real;
  73.     
  74.       begin
  75.          asm
  76.             fldl 8(%ebp)
  77.             fld1
  78.             fpatan
  79.             leave
  80.             ret $8
  81.          end [];
  82.       end;
  83.       
  84.     function cos(d : real) : real;
  85.     
  86.       begin
  87.          asm
  88.             fldl 8(%ebp)
  89.             fcos
  90.             fstsw
  91.             sahf
  92.             jnp LCOS1
  93.             fstp %st(0)
  94.             fldl LCOS0
  95.          LCOS1:
  96.             leave
  97.             ret    $8
  98.          LCOS0:
  99.             .quad    0xffffffffffffffff
  100.          end ['EAX'];
  101.       end;
  102.       
  103.     function exp(d : real) : real;
  104.     
  105.       begin
  106.          asm
  107.             // comes from DJ GPP
  108.         fldl    8(%ebp)
  109.         fldl2e
  110.         fmulp
  111.         fstcww    LCW1
  112.         fstcww    LCW2
  113.         fwait
  114.         andw    $0xf3ff,LCW2
  115.         orw    $0x0400,LCW2
  116.         fldcww    LCW2
  117.         fldl    %st(0)
  118.         frndint
  119.         fldcww    LCW1
  120.         fxch    %st(1)
  121.         fsub    %st(1),%st
  122.         f2xm1
  123.         faddl    LC0
  124.         fscale
  125.         fstp    %st(1)
  126.             leave
  127.         ret $8
  128.  
  129.             // store some help data in the data segment
  130.         .data
  131.     LCW1:
  132.         .word    0
  133.     LCW2:
  134.         .word    0
  135.     LC0:
  136.         .double    0d1.0e+00
  137.  
  138.             // do not forget to switch back to text
  139.             .text
  140.          end;
  141.       end;
  142.  
  143.     function frac(d : real) : real;
  144.  
  145.       begin
  146.          asm
  147.             subl $16,%esp
  148.             fnstcw -4(%ebp)
  149.             fwait
  150.             movw -4(%ebp),%cx
  151.             orw $0x0c3f,%cx
  152.             movw %cx,-8(%ebp)
  153.             fldcw -8(%ebp)
  154.             fwait
  155.             fldl 8(%ebp)
  156.             frndint
  157.             fsubl 8(%ebp)
  158.             fabsl
  159.             fclex
  160.             fldcw -4(%ebp)
  161.             leave
  162.             ret $8
  163.          end ['ECX']; 
  164.       end;
  165.     
  166.     function int(d : real) : real;
  167.     
  168.       begin
  169.          asm
  170.             subl $16,%esp
  171.             fnstcw -4(%ebp)
  172.             fwait
  173.             movw -4(%ebp),%cx
  174.             orw $0x0c3f,%cx
  175.             movw %cx,-8(%ebp)
  176.             fldcw -8(%ebp)
  177.             fwait
  178.             fldl 8(%ebp)
  179.             frndint
  180.             fclex
  181.             fldcw -4(%ebp)
  182.             leave
  183.             ret $8
  184.          end ['ECX']; 
  185.       end;
  186.       
  187.     function trunc(d : real) : longint;
  188.     
  189.       begin
  190.          asm
  191.             subl $16,%esp
  192.             fnstcw -4(%ebp)
  193.             fwait
  194.             movw -4(%ebp),%cx
  195.             orw $0x0c3f,%cx
  196.             movw %cx,-8(%ebp)
  197.             fldcw -8(%ebp)
  198.             fwait
  199.             fldl 8(%ebp)
  200.             fistpl -8(%ebp)
  201.             movl -8(%ebp),%eax
  202.             fldcw -4(%ebp)
  203.             leave
  204.             ret $8
  205.          end ['EAX','ECX']; 
  206.       end;
  207.  
  208.     function round(d : real) : longint;
  209.     
  210.       begin
  211.          asm
  212.             fnstcw -4(%ebp)
  213.             fwait
  214.             subl $8,%esp
  215.             movw $0x1372,-8(%ebp)
  216.             fldcw -8(%ebp)
  217.             fwait
  218.             fldl 8(%ebp)
  219.             fistpl -8(%ebp)
  220.             movl -8(%ebp),%eax
  221.             fldcw -4(%ebp)
  222.             leave
  223.             ret $8
  224.          end ['EAX','ECX']; 
  225.       end;
  226.       
  227.     function ln(d : real) : real;
  228.     
  229.       begin
  230.          asm
  231.             fldln2
  232.             fldl 8(%ebp)
  233.             fyl2x
  234.             leave
  235.             ret $8
  236.          end [];
  237.       end;
  238.       
  239.     function pi : real;
  240.     
  241.       begin
  242.          asm
  243.             fldpi
  244.             leave
  245.             ret
  246.          end [];
  247.       end;
  248.       
  249.     function sin(d : real) : real;
  250.     
  251.       begin
  252.          asm
  253.             fldl 8(%ebp)
  254.             fsin
  255.             fstsw
  256.             sahf
  257.             jnp LSIN1
  258.             fstp %st(0)
  259.             fldl LSIN0
  260.          LSIN1:
  261.             leave
  262.             ret    $8
  263.          LSIN0:
  264.             .quad    0xffffffffffffffff
  265.          end ['EAX'];
  266.       end;
  267.